﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using nbb.darbo_grafikas.Properties;

namespace nbb.darbo_grafikas
{
    internal partial class FormSchedule : Form
    {
        
        private int id;

        Dictionary<int, Defektoskopas> defByCol = new Dictionary<int, Defektoskopas>();
        Dictionary<int, DateTime> dateByRow = new Dictionary<int, DateTime>();

        internal FormSchedule()
        {
            InitializeComponent();
            // naujas grafikas
            // defektoskopai, datos - Program
        }

        internal FormSchedule(int Id)
        {
            InitializeComponent();
            id = Id;
        }

        private void FormSchedule_Load(object sender, EventArgs e)
        {

            load();
            //
            dgv.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_CellDoubleClick);
        }

        private void load()
        {
            createColumns();
            createRows();
        }

        private void createColumns()
        {            
            dgv.Columns.Clear();
            defByCol.Clear();
            dgv.AutoGenerateColumns = false;
            int colindex;
            foreach (Defektoskopas ds in Program.Defektoskopai)
            {
                // column name - defektoskopo id, column header - defektoskopo kodas                
                colindex = dgv.Columns.Add(ds.Id.ToString(), ds.Kodas);                
                dgv.Columns[colindex].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                dgv.Columns[colindex].SortMode = DataGridViewColumnSortMode.NotSortable;
                defByCol.Add(colindex, ds);
            }
        }

        private void createRows()
        {
            dgv.Rows.Clear();
            dateByRow.Clear();
            // tam atvejui, kai užkrauna naują grafiką
            Program.Iseigines.Clear();
            int rowindex;
            for (DateTime day = Program.FromDate; day <= Program.ToDate; day=day.AddDays(1))
            {
                rowindex = dgv.Rows.Add();
                dgv.Rows[rowindex].HeaderCell.Value = Program.ShortDate(day);

                
                if (day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday)
                {
                    setIseigineStyle(rowindex, true);
                    Program.Iseigines.Add(day);
                }
                else
                {
                    setIseigineStyle(rowindex, false);
                }

                dateByRow.Add(rowindex, day);

                // tam atvejui, kai užkraus seną grafiką:
                // setIseigineStyle(day - 1, Program.Iseigines.Contains(new DateTime(year, month, day)));
            }
            dgv.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
        }

        private void toggleIseigine(int eilutesIndex)
        {
            DateTime data = dateByRow[eilutesIndex];
            if (Program.Iseigines.Contains<DateTime>(data))
            {
                Program.Iseigines.Remove(data);
                setIseigineStyle(eilutesIndex, false);
            }
            else
            {
                Program.Iseigines.Add(data);
                setIseigineStyle(eilutesIndex, true);
            }

        }

        private void setIseigineStyle(int rowindex, bool iseigine)
        {
            if (iseigine)
            {
                dgv.Rows[rowindex].DefaultCellStyle.BackColor = Settings.Default.IseiginesBackColor;
                dgv.Rows[rowindex].DefaultCellStyle.ForeColor = Settings.Default.IseiginesFrontColor;
            }
            else
            {
                dgv.Rows[rowindex].DefaultCellStyle.BackColor = Settings.Default.DarboDienosBackColor;
                dgv.Rows[rowindex].DefaultCellStyle.ForeColor = Settings.Default.DarboDienosFrontColor;
            }
        }

        private void dgv_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex < 0 && e.RowIndex >= 0)
            {
                // daryti arba nuimti išeiginę
                toggleIseigine(e.RowIndex);
                dgv.Rows[e.RowIndex].Selected = false;
                //dgv.Rows[-1].Selected = true;
                return;
            }

            if (e.RowIndex < 0 && e.ColumnIndex >= 0)
            {
                // nežinau, ką čia galima daryti
                return;
            }

            // kviesti editorių
            // sužinoti datą
            // sužinoti defektoskopą
            // tikrinti Program.darbai, ar turi šitokį įrašą.
            // jeigu turi, iškviesti editorių, užkrovus darbą,
            // jeigu neturi, iškviesti editorių, užkrovus iš settings;
            // taisomi įrašai
            // on OK
            // jeigu redaguojamas, tai įrašomi nauji duomenys
            // jeigu naujas grafikas, tai sukuriamas naujas objektas Darbas
            // pakeičiama langelio reikšmė.

            DateTime data = dateByRow[e.RowIndex];
            Defektoskopas defektoskopas = defByCol[e.ColumnIndex];
            Darbas currentJob;

            // ieškoma tokio darbo, kurio data ir defektoskopo id sutampa;
            try
            {
                currentJob = Program.Darbai.First(darbas => darbas.Data == data && darbas.Defektoskopas.Id == defektoskopas.Id);
            }
            catch
            {
                currentJob = null;
            }

            // jeigu tokio darbo nerasta, tada kviečiama FormSetupJob(data, defektoskopoId)
            // jeigu toks darbas yra, tada kviečiama FormSetupJob(currentJob)
            FormSetupJob fsj;
            if (currentJob == null)
            {
                fsj = new FormSetupJob(data, defektoskopas);
            }
            else
            {
                fsj = new FormSetupJob(currentJob);
            }

            if (fsj.ShowDialog() != DialogResult.OK)
            {
                fsj.Dispose();
                return;
            }

            fsj.Dispose();
            // jeigu kažkas buvo atlikta - sukurtas naujas darbas arba redaguotas esamas
            dgv[e.ColumnIndex, e.RowIndex].Value = cellTextByDarbas(Program.CurrentDarbas);
        }

        private string cellTextByDarbas(Darbas job)
        {
            List<string> eilutes = new List<string>();
            eilutes.Add(string.Format("{0}, {1}", job.Linija.Kodas, job.Meistrija.Kodas));
            eilutes.Add(string.Format("{0}{1}", job.Stotis == null ? "" : job.Stotis.Pavadinimas + ", ", job.NuoIki));
            eilutes.Add(string.Format("pagr.:{0}, kt.:{1}, iešm.:{2}", job.KmPagrKeliu, job.KmKituKeliu, job.VntIesmu));
            List<string>kodai = new List<string>();
            //job.OperatoriuSarasas.ForEach(delegate (Operatorius op) {kodai.Add(op.Kodas);}); 
            job.OperatoriuSarasas.ForEach(op => kodai.Add(op.Kodas));
            eilutes.Add(string.Join(", ", kodai.ToArray()));
            kodai.Clear();
            job.KituReikaluSarasas.ForEach(kr => kodai.Add(kr.Kodas));
            eilutes.Add(string.Join(", ", kodai.ToArray()));
            return string.Join(Environment.NewLine, eilutes.ToArray());
        }

        private Defektoskopas defektoskopasById(int id)
        {
            try
            {
                return Program.Defektoskopai.Find(defektoskopas => defektoskopas.Id == id);
            }
            catch
            {
                return null;
            }
        }

        private void btnAddRemoveDf_Click(object sender, EventArgs e)
        {
            using (FormChangeDefectoscopes fcd = new FormChangeDefectoscopes())
            {
                if (fcd.ShowDialog() == DialogResult.OK)
                {
                    dgv.Columns.Clear();
                    dgv.Rows.Clear();
                    load();
                    // užkrauti darbus
                }
            }
        }

        private void btnClearJob_Click(object sender, EventArgs e)
        {
            DataGridViewCell cell = dgv.SelectedCells[0];
            if (cell.RowIndex > -1 && cell.ColumnIndex > -1)
            {
                // nustatyt datą ir defektoskopą                
                DateTime data = dateByRow[cell.RowIndex];
                Defektoskopas defektoskopas = defByCol[cell.ColumnIndex];

                // tokį darbą panaikinti iš Program.Darbai
                Program.Darbai.RemoveAll(darbas => darbas.Data == data && darbas.Defektoskopas == defektoskopas);

                // langelį išvalyti
                cell.Value = null;                
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {

        }

        private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            // pirmą kartą išsaugojant, sukuria grafiko id, aprašymą, pavadinimą
            // įrašo darbus į duombazę

            // nuo šitos vietos grafikas tampa redaguojamu
            // kontroliuoti su program.imdoingnow
            if (Program.ImDoingNow == Program.Operation.kuriamas_naujas)
            {
                using (FormDescribeSchedule fds = new FormDescribeSchedule(Program.FromDate, Program.ToDate))
                {
                    if (fds.ShowDialog() == DialogResult.Cancel)
                        return;
                }

                foreach (Darbas darb in Program.Darbai)
                {
                    darb.GrafikaiId = Program.ScheduleId;
                    Program.ImDoingNow = Program.Operation.redaguojamas_senas;
                }
            }

            DbCommunicator.DeleteDarbaiByGrafikasId(Program.ScheduleId);
            DbCommunicator.insertDarbai(Program.Darbai);
        }

       
    }
   
}
